package cn.virens.app.database;

import java.sql.SQLException;

import com.alibaba.druid.pool.DruidDataSource;

import cn.virens.app.main.Component;

/**
 * 数据库管理器
 * 
 * @作者   :loioi
 * @创建时间 :2017年4月8日
 */
public class DatabaseManagerImpl extends DatabaseExecutorImpl<DatabaseConnoction> implements Component {
	private String jdbcUrl = null;
	private String jdbcDriver = null;
	private String jdbcUsername = null;
	private String jdbcPassword = null;

	private DruidDataSource dataSource = null;

	/**
	 * 设置 数据库地址
	 * 
	 * @param jdbcUrl
	 */
	public void setJdbcUrl(String jdbcUrl) {
		this.jdbcUrl = jdbcUrl;
	}

	/**
	 * 设置数据库驱动
	 * 
	 * @param jdbcDriver
	 */
	public void setJdbcDriver(String jdbcDriver) {
		this.jdbcDriver = jdbcDriver;
	}

	/**
	 * 设置数据库账号
	 * 
	 * @param jdbcUsername
	 */
	public void setJdbcUsername(String jdbcUsername) {
		this.jdbcUsername = jdbcUsername;
	}

	/**
	 * 设置数据库密码
	 * 
	 * @param jdbcPassword
	 */
	public void setJdbcPassword(String jdbcPassword) {
		this.jdbcPassword = jdbcPassword;
	}

	/**
	 * 启动
	 * 
	 * @throws SQLException
	 */
	@Override
	public void initialize() throws Exception {
		logger.debug("The Db Manager initialize--------------------------");

		this.dataSource = new DruidDataSource();
		this.dataSource.setUrl(jdbcUrl);
		this.dataSource.setUsername(jdbcUsername);
		this.dataSource.setPassword(jdbcPassword);
		this.dataSource.setDriverClassName(jdbcDriver);
		// 配置初始化大小、最小、最大
		this.dataSource.setInitialSize(1);
		this.dataSource.setMinIdle(1);
		this.dataSource.setMaxActive(1000);
		this.dataSource.setMaxWait(60000);// 配置获取连接等待超时的时间

		this.dataSource.setTimeBetweenEvictionRunsMillis(60000);// 配置间隔多久才进行一次检测，检测需要关闭的空闲连接，单位是毫秒
		this.dataSource.setMinEvictableIdleTimeMillis(300000);// 配置一个连接在池中最小生存的时间，单位是毫秒

		this.dataSource.setValidationQuery("SELECT 1;");
		this.dataSource.setValidationQueryTimeout(30000);

		this.dataSource.setTestWhileIdle(true);
		this.dataSource.setTestOnBorrow(false);
		this.dataSource.setTestOnReturn(false);

		this.dataSource.setFilters("slf4j");
	}

	/**
	 * 停止
	 */
	@Override
	public void destroy() {
		this.dataSource.close();
	}

	@Override
	protected DatabaseConnoction getConnection() throws SQLException {
		return new DatabaseConnoction(dataSource.getConnection());
	}

}
